package com.zhxy.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.zhxy.bean.User;

import java.util.HashMap;

public class JWTUtils {

    public static final String SECRET="dY8300o1WQ3345;id<3w48";

    /**
     * 生成JWT(token)
     * @param userJSON
     * @return
     */
    public static String createJWT(String userJSON){

        // 组装数据
        HashMap<String, Object> header = new HashMap<>();
        header.put("alg","HS256");
        header.put("typ","JWT");

        return JWT.create()
                // 头部
                .withHeader(header)
                // 负载
                .withClaim("user",userJSON)
                // 签名
                .sign(Algorithm.HMAC256(SECRET));
    }

    /**
     * 验证JWT
     * @param jwt
     * @return
     */
    public static Boolean verifyJWT(String jwt){

        try {
            // 使用密钥创建一个JWT验证器对象
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();

            // 验证JWT
            jwtVerifier.verify(jwt);

            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 解析JWT
     * @param jwt
     * @return
     */
    public static User parseUserFromJWT(String jwt){
        try {
            // 使用密钥创建一个JWT验证器对象
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();

            // 验证JWT，得到一个解码后的JWT对象
            DecodedJWT verify = jwtVerifier.verify(jwt);

            // 通过解码后的jwt对象，获取负载数据
            Claim userClaim = verify.getClaim("user");

            String userJSON = userClaim.asString();

            return JSONUtils.toBean(userJSON,User.class);
        } catch (TokenExpiredException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}
